package linear;

import java.util.Iterator;

public class LinkList<T> implements Iterable<T> {
    //    记录头节点
    private Node head;
    //    记录链表的长度
    private int N;

    public LinkList() {
//        初始化头节点
        head = new Node(null, null);
        this.N = 0;
    }

    //    清空链表
    public void clear() {
        head.next = null;
        head.item = null;
        N = 0;

    }

    //    获取链表的长度
    public int length() {
        return N;
    }

    //    判断线性表是否为空
    public boolean isEmpty() {

        return N == 0;
    }

    //    获取指定位置i处的元素
    public T get(int i) {
        Node n = head;
        for (int index = 0; index < i; index++) {

            n = n.next;
        }
        return (T) n.item;
    }

    //    向链表中添加元素
    public void insert(T t) {
//        找到最后一个节点
        Node n = head;
        while (n.next != null) {

            n = n.next;
        }
//        创建新节点
        Node newNode = new Node(t, null);
        n.next = newNode;
//        链表的长度加一
        N++;
    }

    //    向指定位置i处添加元素
    public void insert(int i, T t) {

//        寻找位置i之前的节点
        Node pre = head;
        for (int index = 0; index <= i - 1; index++) {

            pre = pre.next;
        }

//        创建新节点
        Node newNode = new Node(t, null);
        newNode.next = pre.next;
        pre.next = newNode;
        N++;
    }

    //    删除指定位置的元素，并返回删除的元素
    public T remove(int i) {
//        寻找位置i之前的节点
        Node pre = head;
        for (int index = 0; index <= i; index++) {

            pre = pre.next;
        }
        //        寻找当前节点
        Node cur = pre.next;
        pre.next = pre.next.next;
        N--;
        return (T) cur.item;
    }

    //    查找元素t在链表中第一次出现的位置
    public int indexOf(T t) {

        Node n = head;
        for (int i = 0; n.next != null; i++) {

            n = n.next;
            if (n.item.equals(t)) {

                return i;
            }
        }
        return -1;
    }


    //    反转链表
    public void reverse() {
        if (N == 0) {
            return;
        }
        reverse(head.next);
    }

    public Node reverse(Node curr) {
        if (curr.next == null) {
            head.next = curr;
            return curr;
        }
//        返回值就是反转后当前节点的上一节点
        Node pre = reverse(curr.next);
//        上一个节点的next指向当前节点
        pre.next = curr;
        curr.next = null;
        return curr;
    }


    @Override
    public Iterator<T> iterator() {
        return new LIterator();
    }

    private class LIterator implements Iterator<T> {

        private Node n;

        public LIterator() {
            n = head;
        }

        @Override
        public boolean hasNext() {
            return n.next != null;
        }

        @Override
        public T next() {
            n = n.next;

            return (T) n.item;
        }
    }
}
